#include "speechManager.h"
#include <iostream>

using namespace std;

SpeechManager::SpeechManager() {
    this->initSpeech();
    this->createSpeech();
    this->loadRecord();
}

void SpeechManager::show_Menu() {
    cout << "********************************************" << endl;
    cout << "*************  欢迎参加演讲比赛 ************" << endl;
    cout << "*************  1.开始演讲比赛  *************" << endl;
    cout << "*************  2.查看往届记录  *************" << endl;
    cout << "*************  3.清空比赛记录  *************" << endl;
    cout << "*************  0.退出比赛程序  *************" << endl;
    cout << "********************************************" << endl;
    cout << endl;
}

void SpeechManager::exitSystem() {
    cout << "欢迎下次使用" << endl;
}

void SpeechManager::initSpeech() {
    this->v1.clear();//清空容器
    this->v2.clear();
    this->vVictory.clear();
    this->mSpeaker.clear();
    this->mRecord.clear();
    this->mIndex = 1;//初始化比赛轮数
}

void SpeechManager::createSpeech() {
    string nameSeed = "ABCDEFGHIJKL";
    for (int i = 0; i < nameSeed.size(); ++i) {
        string name = "选手";
        name += nameSeed[i];
        Speaker sp;
        sp.m_name = name;
        for (int j = 0; j < 2; ++j) {
            sp.m_Score[j] = 0;
        }

        this->v1.push_back(i + 10001);
        this->mSpeaker.insert(make_pair(i + 10001, sp));
    }
}

void SpeechManager::StartSpeech() {
    this->speechDraw();
    this->SpeechContest();
    this->showScore();
    this->mIndex++;
    this->speechDraw();
    this->SpeechContest();
    this->showScore();
    this->saveRecord();

    this->initSpeech();
    this->createSpeech();
    this->loadRecord();
    cout << "本届比赛完毕！" << endl;
}

void SpeechManager::speechDraw() {
    cout << "第 << " << this->mIndex << " >> 轮比赛选手正在抽签" << endl;
    cout << "--------------------------" << endl;
    cout << "抽签后演讲顺序如下： " << endl;

    if (this->mIndex == 1) {
        //第一轮比赛
        random_shuffle(v1.begin(), v1.end());
        for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
            cout << *it << " ";
        }
        cout << endl;
    } else {
        //第二轮比赛
        random_shuffle(v2.begin(), v2.end());
        for (vector<int>::iterator it = v2.begin(); it != v2.end(); ++it) {
            cout << *it << " ";
        }
        cout << endl;
    }
    cout << "--------------------------" << endl;
}

void SpeechManager::SpeechContest() {
    cout << "----------- 第" << this->mIndex << " 轮比赛正式开始 --------------" << endl;
    multimap<double, int, greater<double>> groupScore;
    int num = 0;
    vector<int> vSrc;
    if (this->mIndex == 1) {
        vSrc = v1;
    } else {
        vSrc = v2;
    }
    for (vector<int>::iterator it = vSrc.begin(); it != vSrc.end(); ++it) {
        num++;
        deque<double> d;
        for (int i = 0; i < 10; ++i) {
            double score = (rand() % 401 + 600) / 10.f;
            d.push_back(score);
        }
        sort(d.begin(), d.end(), greater<double>());
        d.pop_front();
        d.pop_back();

        double sum = accumulate(d.begin(), d.end(), 0.0f);
        double avg = sum / (double) d.size();
        this->mSpeaker[*it].m_Score[this->mIndex - 1] = avg;
        groupScore.insert(make_pair(avg, *it));
        if (num % 6 == 0) {
            cout << "第" << num / 6 << "小组比赛名次： " << endl;
            for (multimap<double, int, greater<double>>::iterator it = groupScore.begin();
                 it != groupScore.end(); ++it) {
                cout << "编号： " << it->second << " 姓名： " << this->mSpeaker[it->second].m_name << " 成绩： "
                     << this->mSpeaker[it->second].m_Score[this->mIndex - 1] << endl;
            }
            int count = 0;
            for (multimap<double, int, greater<double>>::iterator it = groupScore.begin();
                 it != groupScore.end(); ++it) {
                if (this->mIndex == 1) {
                    v2.push_back((*it).second);
                } else {
                    vVictory.push_back((*it).second);
                }
            }

            groupScore.clear();
            cout << endl;
        }
    }

    cout << "------------------ 第" << this->mIndex << "轮比赛完毕 --------------" << endl;
}

void SpeechManager::showScore() {
    cout << "------------------ 第" << this->mIndex << "轮晋级选手信息如下： -------------------" << endl;
    vector<int> v;
    if (this->mIndex == 1) {
        v = v2;
    } else {
        v = vVictory;
    }
    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
        cout << "选手编号： " << *it << " 姓名： " << this->mSpeaker[*it].m_name << " 得分： " <<
             this->mSpeaker[*it].m_Score[this->mIndex - 1] << endl;
    }
    cout << endl;
    this->show_Menu();
}

void SpeechManager::saveRecord() {
    ofstream ofs;
    ofs.open("speech.csv", ios::out | ios::app);
    for (vector<int>::iterator it = vVictory.begin(); it != vVictory.end(); ++it) {
        ofs << *it << "," << mSpeaker[*it].m_Score[1] << ",";
    }
    ofs << endl;
    cout << "记录已保存" << endl;
    this->fileIsEmpty = false;
}

void SpeechManager::loadRecord() {
    ifstream ifs("speech.csv", ios::in);

    if (!ifs.is_open()) {
        this->fileIsEmpty = true;
        ifs.close();
        return;
    }

    char ch;
    ifs >> ch;
    if (ifs.eof()) {
        this->fileIsEmpty = true;
        ifs.close();
        return;
    }

    this->fileIsEmpty = false;
    ifs.putback(ch);
    string data;
    int index = 0;
    while (ifs >> data) {
        vector<string> v;
        int pos = -1;
        int start = 0;
        while (true) {
            pos = data.find(",", start);
            if (pos == -1) {
                break;
            }
            string temp = data.substr(start, pos - start);
            v.push_back(temp);
            start = pos + 1;
        }
        this->mRecord.insert(make_pair(index, v));
        index++;
    }
    ifs.close();
}

void SpeechManager::showRecord() {
    if (this->fileIsEmpty) {
        cout << "文件为空或者文件不存在！" << endl;
    } else {
        for (int i = 0; i < this->mRecord.size(); ++i) {
            cout << "第" << i + 1 << "届 "
                 << "冠军编号：" << this->mRecord[i][0] << " 得分： " << this->mRecord[i][1] << " "
                 << "亚军编号：" << this->mRecord[i][2] << " 得分： " << this->mRecord[i][3] << " "
                 << "季军编号：" << this->mRecord[i][4] << " 得分： " << this->mRecord[i][5] << endl;
        }
    }
}

void SpeechManager::clearRecord() {
    cout << "是否确定清空文件？" << endl;
    cout << "1、是" << endl;
    cout << "2、否" << endl;

    int select = 0;
    cin >> select;
    if (select == 1) {
        ofstream ofs("speech.csv", ios::trunc);
        ofs.close();
        this->initSpeech();
        this->createSpeech();
        this->loadRecord();
        cout << "清空成功！" << endl;
    }
}

SpeechManager::~SpeechManager() {

}